/*
  不同于一般的C语言编译器
  Arduino的C编译器做了简化：1.函数无论定义到了哪里，编译器都能找到（自动原型生成）
                           2.定义在主文件中的全局变量，在其他文件中即使不声明也可直接使用

对此项目的说明：本文件为程序入口部分，setup中初始化引脚与定时器
               IR.ino为NEC协议的红外模块，定义了NEC协议相关函数，方便发送红外信号
               GreeAircon.ino为格力空调YAPOF3型号的红外指令编码，调用了IR.ino中的函数
               OLED.ino以及font.h为OLED显示屏商家提供的显示屏驱动代码，直接使用即可
               InfoDisplay.ino主要负责遥控器信息在显示屏上的显示，调用了OLED.ino中的函数
          依赖关系为：
          AirconCtrller -> GreeAircon   -> IR
                        -> InfoDisplay  -> OLED
*/
/*
  重要：本项目使用了TimerOne库，在Arduino左侧栏的第三项Library中搜索TimerOne并安装
*/

int Temperature = 26;
int Fan = 0;
int Power = 0;
#define POWER_BTN 7
#define BOOM_BTN 6
#define T_INC_BTN 5
#define T_DEC_BTN 4
#define F_INC_BTN 3
#define F_DEC_BTN 2


void setup() {
  IR_Init(); //初始化红外线控制的D9引脚，以及启动计时器以能够输出PWM波
  InfoDisplay_Init(); //初始化OLED屏幕，并打印初始信息
  for (int i = 2; i <= 7; i++) { //初始化按键引脚，开始读取按键
    pinMode(i, INPUT_PULLUP); //上拉输入
  }
}

void loop() { //循环读取按键，处理对应操作
  int i;
  for (i = 2; i <= 7; i++) { //读取每个按键
    if(digitalRead(i) == 0) { //如果按键被按下，延迟10ms以消抖
      delay(10);
      if(digitalRead(i) == 0) { //10ms后仍是按下状态，说明按键确实被按下，而不是松开时的抖动
        handleButton(i); //处理被按下的按键
        InfoDisplay_Update(Temperature,Fan,Power); //刷新显示屏显示的内容
        if(Power) { //向空调发送更新后的数据（以红外线）
          GreeAircon_SetStatus(Temperature,Fan);
        } else {
          GreeAircon_Off();
        }
        while(digitalRead(i) == 0); //若按键仍然处于按下状态，则等待按键弹起
      }
    }
  }
}

void handleButton(int i) { //根据被按下的按键，进行对应操作
  switch(i) {
      case POWER_BTN: //电源开/关
      Power ^= 1;
      break;
      case BOOM_BTN: //待我做个炫酷的爆炸特效
      break;
      case T_INC_BTN: //温度+
      if(Temperature < 31) {
        Temperature++;
      }
      break;
      case T_DEC_BTN: //温度-
      if(Temperature > 16) {
        Temperature--;
      }
      break;
      case F_INC_BTN: //风力+
      if(Fan < 5) {
        Fan++;
      }
      break;
      case F_DEC_BTN: //风力-
      if(Fan > 0) {
        Fan--;
      }
      break;
    }
}